﻿// Main.cs created with MonoDevelop
// User: renato at 13:33 18/5/2008
//
// To change standard headers go to Edit->Preferences->Coding->Standard Headers
//
using System;
using System.IO;

namespace compilador
{
	class lac
	{
		private static void inicializaSimbolos(Simbolos pSimb)
		{
			pSimb.Insere(TipoToken.t_program,"program");
			pSimb.Insere(TipoToken.t_var,"var");
			pSimb.Insere(TipoToken.t_tipodado,"integer");
			pSimb.Insere(TipoToken.t_tipodado,"real");
			pSimb.Insere(TipoToken.t_procedure,"procedure");			
			pSimb.Insere(TipoToken.t_begin,"begin");
			pSimb.Insere(TipoToken.t_end,"end");
			pSimb.Insere(TipoToken.t_else,"else");
			pSimb.Insere(TipoToken.t_read,"read");
			pSimb.Insere(TipoToken.t_write,"write");
			pSimb.Insere(TipoToken.t_while,"while");
			pSimb.Insere(TipoToken.t_if,"if");
			pSimb.Insere(TipoToken.t_then,"then");
			pSimb.Insere(TipoToken.t_do,"do");
			
		}
		
		public static void Main(string[] args)
		{
			if (args.Length.Equals(0) || !File.Exists(args[0]))
			{
				Console.WriteLine("Arquivo inválido ou não informado.");
				return;
			}
			Buffer buffer = new Buffer(args[0]);
			Simbolos TabSimbolos = new Simbolos();
			inicializaSimbolos(TabSimbolos);			
			Lexico lex = new Lexico(buffer, TabSimbolos);
			Sintatico sin = new Sintatico(lex, TabSimbolos);
			sin.programa();
			
			
			/*			
			while (!buffer.fimDoArquivo()){
                        Console.WriteLine("lex ->"+lex.proximoToken());
			}
		
			TabSimbolos.ImprimeLista();
			*/
            buffer.FechaArquivo();
			Singleton s = Singleton.Instancia;
            if (!s.deuErro)
            {
                string nomeArq = "";
                if (args.Length == 2)
                {
                    nomeArq = args[1];
                }
                else
                {
                    FileInfo f = new FileInfo(args[0]);
                    nomeArq = f.FullName.Replace(f.Extension,".obj");
                }

                CodMaquina.InsereCodigo("PARA");
                CodMaquina.SalvarEmArquivo(@nomeArq);
                Console.WriteLine("Compilacao concluida sem erros");

            }
            else
            {
                Console.WriteLine("Um ou mais erros foram encontrados, geração de código objeto interrompida.");
            }

			Console.ReadKey();
		}
	}
}
